//package com.md.util;
//
//import com.aspose.pdf.Document;
//import com.aspose.pdf.XImage;
//import com.md.base.exception.ServerException;
//import com.md.model.base.FileStream;
//import com.md.value.enums.ErrorEnum;
//import lombok.experimental.UtilityClass;
//import lombok.extern.slf4j.Slf4j;
//import net.lingala.zip4j.io.ZipOutputStream;
//import net.lingala.zip4j.model.ZipParameters;
//import net.lingala.zip4j.util.Zip4jConstants;
//import org.apache.commons.codec.binary.Hex;
//import org.apache.commons.compress.utils.Lists;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.util.ObjectUtils;
//
//import javax.servlet.http.HttpServletResponse;
//import java.io.BufferedInputStream;
//import java.io.BufferedOutputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.DataInputStream;
//import java.io.DataOutputStream;
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.OutputStream;
//import java.net.HttpURLConnection;
//import java.net.URL;
//import java.net.URLConnection;
//import java.net.URLEncoder;
//import java.nio.charset.Charset;
//import java.nio.charset.StandardCharsets;
//import java.security.MessageDigest;
//import java.security.NoSuchAlgorithmException;
//import java.util.Arrays;
//import java.util.List;
//import java.util.UUID;
//import java.util.zip.ZipEntry;
//import java.util.zip.ZipInputStream;
//
///**
// * @author 刘骄阳
// * 2023-03-01 22:19
// */
//@Slf4j
//@UtilityClass
//public class FileUtil {
//  private static MessageDigest messageDigest;
//
//  static {
//    try {
//      messageDigest = MessageDigest.getInstance("MD5");
//    } catch (NoSuchAlgorithmException e) {
//      e.printStackTrace();
//    }
//  }
//
//  /**
//   * 读取文件流,根据网络url
//   *
//   * @param filePath 网络url
//   * @return 文件流
//   */
//  public static InputStream getFileInputStream(final String filePath) {
//    return ClassUtils.executeWithRetry(() -> {
//      try {
//        URL url = new URL(filePath);
//        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//        //设置超时间为3秒
//        conn.setConnectTimeout(3000);
//        //防止屏蔽程序抓取而返回403错误
//        conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//        System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");
//        return conn.getInputStream();
//      } catch (Exception e) {
//        log.error("导出文件流失败: {}", e.getMessage(), e);
//        throw ServerException.build(ErrorEnum.READ_FILE_ERROR);
//      }
//    }, IOException.class);
//  }
//
//
//  /**
//   * 对一个文件获取md5值
//   *
//   * @return md5串
//   */
//  public static String getMD5(final BufferedInputStream bufferedInputStream) {
//    if (bufferedInputStream.markSupported()) {
//      // 判断是否支持标记位置,并标记记录点,如果超过可记录点会报错
//      bufferedInputStream.mark(Integer.MAX_VALUE);
//    }
//    byte[] buffer = new byte[8192];
//    int length;
//    try {
//      while ((length = bufferedInputStream.read(buffer)) != -1) {
//        messageDigest.update(buffer, 0, length);
//      }
//      if (bufferedInputStream.markSupported()) {
//        // 判断是否支持标记位置,并标记记录点,如果超过可记录点会报错
//        bufferedInputStream.reset();
//      }
//      return new String(Hex.encodeHex(messageDigest.digest()));
//    } catch (Exception e) {
//      return null;
//    }
//  }
//
//  /**
//   * 对一个文件获取md5值
//   *
//   * @return md5串
//   */
//  public static String getMD5(final InputStream inputStream) {
//    byte[] buffer = new byte[8192];
//    int length;
//    try {
//      while ((length = inputStream.read(buffer)) != -1) {
//        messageDigest.update(buffer, 0, length);
//      }
//      return new String(Hex.encodeHex(messageDigest.digest()));
//    } catch (Exception e) {
//      return null;
//    }
//  }
//
//  /**
//   * 对一个文件获取md5值
//   *
//   * @return md5串
//   */
//  public static String getMD5(final File file) {
//    try (FileInputStream fileInputStream = new FileInputStream(file)) {
//      return getMD5(fileInputStream);
//    } catch (IOException e) {
//      e.printStackTrace();
//    }
//    return null;
//  }
//
//  public static void writeToFile(final ByteArrayOutputStream byteArrayOutputStream,
//                                 final String path) {
//    try (FileOutputStream fileOutputStream = new FileOutputStream(path)) {
//      byteArrayOutputStream.writeTo(fileOutputStream);
//      fileOutputStream.flush();
//    } catch (Exception e) {
//      log.error("写入文件异常: {}", e.getMessage(), e);
//      throw ServerException.build(ErrorEnum.WRITE_FILE_ERROR);
//    }
//  }
//
//
//  public static void exportFile(final String fileName, final byte[] fileDate) {
//    HttpServletResponse response = HttpUtils.getHttpServletResponse();
//    if (response == null) {
//      return;
//    }
//    try (OutputStream outputStream = new BufferedOutputStream(response.getOutputStream())) {
//      // 清空response
//      response.reset();
//      // 设置response的Header
//      // 防止中文乱码
//      String finalFileName = new String(fileName.getBytes("GBK"), StandardCharsets.ISO_8859_1);
//      // 设值返回文件属性，浏览器会根据属性调用下载文件方法
//      response.addHeader("Content-Disposition", "attachment;filename=" + finalFileName);
//      // 设值文件大小属性，浏览器用于判断文件是否写完
//      response.addHeader("Content-Length", "" + fileDate.length);
//      // 前端获取文件名，需要解码
//      response.addHeader("downLoadName", URLEncoder.encode(fileName, "UTF-8"));
//      // 定义输出类型为二进制流输出
//      response.setContentType("application/octet-stream");
//      // 把流写入response
//      outputStream.write(fileDate);
//      // 刷新缓存
//      outputStream.flush();
//    } catch (IOException e) {
//      log.error("导出文件失败: {}", e.getMessage(), e);
//      throw ServerException.build(ErrorEnum.WRITE_FILE_ERROR);
//    }
//  }
//
////  public static void exportFile(final FileStream fileStream) {
////    exportFile(fileStream.getFileName(), fileStream.getFileData());
////  }
//
//  public static void writeData(final String url, final String savePath) {
//    InputStream fileInputStream = getFileInputStream(url);
//    if (fileInputStream == null) {
//      return;
//    }
//    List<byte[]> list = Lists.newArrayList();
//    try {
//      int arrayLength = 8192;
//      byte[] buffer = new byte[arrayLength];
//      int length;
//      while ((length = fileInputStream.read(buffer)) != -1) {
//        // 有可能读出来无效数据
//        if (arrayLength == length) {
//          list.add(buffer);
//        } else {
//          byte[] temp = new byte[length];
//          for (int i = 0; i < length; i++) {
//            temp[i] = buffer[i];
//          }
//          list.add(temp);
//        }
//        buffer = new byte[arrayLength];
//      }
//      BinarySystem.saveFile(savePath, list, true);
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
//  }
//
//  public static void readData(final String filePath, final String savePath) {
//    byte[] bytes = BinarySystem.readFile(filePath);
//    if (ObjectUtils.isEmpty(bytes)) {
//      return;
//    }
//    try (FileOutputStream fileOutputStream = new FileOutputStream(savePath)) {
//      fileOutputStream.write(bytes);
//    } catch (IOException e) {
//      e.printStackTrace();
//    }
//  }
//
//  /**
//   * 保存二进制文件
//   */
//  @UtilityClass
//  public static class BinarySystem {
//    /**
//     * 保存文件为二进制文件
//     *
//     * @param filePath 文件路径
//     * @param list     数据
//     * @param append   是否追加(true: 追加; false: 覆盖)
//     */
//    public static void saveFile(final String filePath, final List<byte[]> list, final boolean append) {
//      File file = new File(filePath);
//      if (!file.exists()) {
//        try {
//          if (!file.createNewFile()) {
//            return;
//          }
//        } catch (IOException e) {
//          e.printStackTrace();
//        }
//      }
//      try (DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(filePath, append))) {
//        for (byte[] bytes : list) {
//          dataOutputStream.write(bytes);
//        }
//        dataOutputStream.flush();
//      } catch (IOException e) {
//        e.printStackTrace();
//      }
//    }
//
//    /**
//     * 读取二进制文件
//     *
//     * @param filePath 文件路径
//     * @return 字节数组
//     */
//    public static byte[] readFile(final String filePath) {
//      File file = new File(filePath);
//      if (!file.exists()) {
//        return new byte[0];
//      }
//      try (DataInputStream dataInputStream = new DataInputStream(new FileInputStream(filePath))) {
//        byte[] bytes = new byte[dataInputStream.available()];
//        dataInputStream.read(bytes);
//        return bytes;
//      } catch (IOException e) {
//        log.error("读取文件失败,{}", e.getMessage(), e);
//        throw ServerException.build(ErrorEnum.READ_FILE_ERROR);
//      }
//    }
//
//    /**
//     * 保存文件为二进制文件
//     *
//     * @param filePath 文件路径
//     * @param data     数据
//     * @param append   是否追加(true: 追加; false: 覆盖)
//     */
//    public static void saveFile(final String filePath, final byte[] data, final boolean append) {
//      File file = new File(filePath);
//      if (!file.exists()) {
//        try {
//          if (!file.createNewFile()) {
//            return;
//          }
//        } catch (IOException e) {
//          e.printStackTrace();
//        }
//      }
//      try (DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(filePath, append))) {
//        dataOutputStream.write(data);
//        dataOutputStream.flush();
//      } catch (IOException e) {
//        e.printStackTrace();
//      }
//    }
//  }
//
//  public static class Zip {
//    private Zip() {
//    }
//
//    public static List<String> readZipByUrl(final String url) {
//      List<String> fileName = Lists.newArrayList();
//      try {
//        // "https://community-static.amwaynet.com.cn/apps/material-radar/846716266776142802435422520313.zip"
//        URL zipUrl = new URL(url);
//        URLConnection urlConnection = zipUrl.openConnection();
//        urlConnection.setConnectTimeout(3000);
//        //防止屏蔽程序抓取而返回403错误
//        urlConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//        try (InputStream inputStream = urlConnection.getInputStream()) {
//          try (ZipInputStream zipInputStream = new ZipInputStream(inputStream, Charset.forName("GBK"))) {
//            ZipEntry zipEntry;
//            while ((zipEntry = zipInputStream.getNextEntry()) != null) {
//              //通过zip.getNextEntry（）来得到ZipEntry对象,得到文件名称
//              fileName.add(zipEntry.getName());
//            }
//          }
//        }
//      } catch (Exception e) {
//        log.error("读取压缩文件失败,{}", e.getMessage(), e);
//        throw ServerException.build(ErrorEnum.READ_FILE_ERROR);
//      }
//      return fileName;
//    }
//
//    public static ZipParameters getZipFileConfig(final String password) {
//      ZipParameters zipConfig = new ZipParameters();
//      // 压缩方式
//      //COMP_STORE = 0;（仅打包，不压缩）
//      //COMP_DEFLATE = 8;（默认）
//      //COMP_AES_ENC = 99; 加密压缩
//      zipConfig.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
//      // 压缩级别
//      // DEFLATE_LEVEL_FASTEST = 1; (速度最快，压缩比最小)
//      // DEFLATE_LEVEL_FAST = 3; (速度快，压缩比小)
//      // DEFLATE_LEVEL_NORMAL = 5; (一般)
//      // DEFLATE_LEVEL_MAXIMUM = 7;
//      // DEFLATE_LEVEL_ULTRA = 9;
//      zipConfig.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
//      if (StringUtils.isNotBlank(password)) {
//        // 加密文件
//        zipConfig.setEncryptFiles(true);
//        // 加密方法,如果配置不对将在linux上无法解压
//        zipConfig.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
//        // 密码
//        zipConfig.setPassword(password.toCharArray());
//      }
//      // 源文件是否为外部流，true表示使用内存文件而非本地存储文件
//      zipConfig.setSourceExternalStream(true);
//      return zipConfig;
//    }
//
//    public static void exportZipFile(final List<FileStream> list, final FileStream zipFileStream) {
//      HttpServletResponse response = HttpUtils.getHttpServletResponse();
//      if (ObjectUtils.isEmpty(response)) {
//        return;
//      }
//      int allSize = list.stream().map(FileStream::getSize).mapToInt(Math::toIntExact).sum();
//      try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(allSize)) {
//        ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream);
//        list.forEach(fileStream -> {
//          ZipParameters zipFileConfig = Zip.getZipFileConfig(fileStream.getPassword());
//          zipFileConfig.setFileNameInZip(fileStream.getFileName());
//
//          try {
//            zipOutputStream.putNextEntry(null, zipFileConfig);
//            zipOutputStream.write(fileStream.getFileData());
//            zipOutputStream.closeEntry();
//          } catch (Exception e) {
//            log.error("写入压缩包异常: {}", e.getMessage(), e);
//            throw ServerException.build(ErrorEnum.WRITE_FILE_ERROR);
//          }
//        });
//        zipOutputStream.finish();
//        zipOutputStream.close();
//        // 写入压缩包的数据
//        zipFileStream.setFileData(byteArrayOutputStream.toByteArray());
//        zipFileStream.setSize(allSize);
//        exportFile(zipFileStream);
//      } catch (Exception e) {
//        log.error("写入压缩包异常: {}", e.getMessage(), e);
//        throw ServerException.build(ErrorEnum.WRITE_FILE_ERROR);
//      }
//    }
//
//    /**
//     * 添加文件到压缩文件中
//     *
//     * @param fileName 文件名
//     * @param data     文件数据
//     * @param password 密码
//     * @desc 将内存文件写入zip内。注意：最后必须调用closeZipOutputStream关闭输出流，或者手动关闭
//     */
//    public static void addFileToZip(final String fileName, final byte[] data, final String password,
//                                    final ZipOutputStream zipOutputStream) {
//      if (ObjectUtil.hasEmpty(fileName, data, zipOutputStream)) {
//        log.error("参数异常,fileName={},data={},zipOutputStream={}", fileName, Arrays.toString(data), zipOutputStream);
//        throw ServerException.build(ErrorEnum.WRITE_FILE_ERROR);
//      }
//      try {
//        ZipParameters zipFileConfig = getZipFileConfig(password);
//        zipFileConfig.setFileNameInZip(fileName);
//        zipOutputStream.putNextEntry(null, zipFileConfig);
//        zipOutputStream.write(data);
//        zipOutputStream.closeEntry();
//      } catch (Exception e) {
//        log.error("写入压缩包异常: {}", e.getMessage(), e);
//        throw ServerException.build(ErrorEnum.WRITE_FILE_ERROR);
//      }
//    }
//  }
//
//  /**
//   * 校验文件是否存在
//   *
//   * @param file 文件
//   * @return 是否存在(true : 存在 ; false : 不存在)
//   */
//  public static boolean judgeFileExists(final File file) {
//    return ObjectUtil.notEmpty(file) && file.exists();
//  }
//
//  /**
//   * 获取文件
//   *
//   * @param filePath filePath 文件父路径（如：D:/doc/excel/）
//   * @param fileName 文件名称（不带尾缀，如：用户表）
//   * @return 本地File文件对象
//   */
//  public static File getFile(final String filePath, final String fileName, final String suffix) {
//    File dirFile = null;
//    File file = null;
//    try {
//      if (ObjectUtil.isEmpty(filePath)) {
//        return File.createTempFile(UUID.randomUUID().toString(), suffix);
//      }
//      // 判定文件夹是否存在，如果不存在，则级联创建
//      dirFile = new File(filePath);
//      if (!judgeFileExists(dirFile) && (!dirFile.mkdirs())) {
//        log.error("创建目录失败: {}", filePath);
//      }
//      String fileFullPath;
//      // 获取文件夹全名
//      if (filePath.endsWith(File.separator)) {
//        fileFullPath = filePath + fileName + suffix;
//      } else {
//        fileFullPath = filePath + File.separator + fileName + suffix;
//      }
//      file = new File(fileFullPath);
//      if (!judgeFileExists(file) && (!file.createNewFile())) {
//        log.error("创建文件失败: {}", fileFullPath);
//      }
//      return file;
//    } catch (IOException e) {
//      log.error("创建文件失败: {}", e.getMessage(), e);
//      if (judgeFileExists(dirFile)) {
//        log.info("目录删除: {}", dirFile.delete());
//      }
//      if (judgeFileExists(file)) {
//        log.info("文件删除: {}", file.delete());
//      }
//      throw ServerException.build(ErrorEnum.WRITE_FILE_ERROR);
//    }
//  }
//
//  @UtilityClass
//  public static class PDF {
//    public void readPDF() throws IOException {
//      // Open a document
//      Document pdfDocument = new Document("E:\\刘骄阳.pdf");
//
//// Extract a particular image
//      XImage xImage = pdfDocument.getPages().get_Item(1).getResources().getImages().get_Item(1);
//
//      // Create stream object to save the output image
//      try (OutputStream output = new FileOutputStream("E:\\output.jpg")) {
//        // Save the output image
//        xImage.save(output);
//      } catch (IOException e) {
//        System.err.println(e.getMessage());
//
//      }
//    }
//
//  }
//}
